package io;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import midi.Nota;
import midi.Notas;

public class Reader {

	protected BufferedReader arquivo = null;
	protected ArrayList<Integer> instrumentos = null;
	protected ArrayList<Notas> notasFaixas;

	public Reader(String path, String nomeDoArquivo) {
		instrumentos = new ArrayList<Integer>();
		notasFaixas = new ArrayList<Notas>();

		if (nomeDoArquivo == null)
			nomeDoArquivo = "";
		if (path == null)
			path = "";

		try {
			arquivo = new BufferedReader(new FileReader(path + nomeDoArquivo));
		} catch (IOException e) {
			System.out.println("Reader - Reader()");
			e.printStackTrace();
		}
		leArquivo();
	}
	
	public Reader(String absolutePath) {
		instrumentos = new ArrayList<Integer>();
		notasFaixas = new ArrayList<Notas>();

		
		if (absolutePath == null)
			absolutePath = "";

		try {
			arquivo = new BufferedReader(new FileReader(absolutePath));
		} catch (IOException e) {
			System.out.println("Reader - Reader()");
			e.printStackTrace();
		}
		leArquivo();
	}

	private void leArquivo() {
		String linha;
		Notas notas = new Notas();
		int nota = 0;
		int duracao = 0;
		int intensidade = 0;

		try {
			while ((linha = arquivo.readLine()) != null) {
				if (linha.equalsIgnoreCase("@")) {
					notas = new Notas();

					// Carrega o instrumento da faixa:
					linha = arquivo.readLine();
					instrumentos.add(Integer.parseInt(linha));
				}
				if (linha.equalsIgnoreCase("#")) {
					nota = Integer.parseInt(arquivo.readLine());
					duracao = Integer.parseInt(arquivo.readLine());
					intensidade = Integer.parseInt(arquivo.readLine());
					notas.add(new Nota(nota, duracao, intensidade));
				}
				if (linha.equalsIgnoreCase("$")) {
					// Insere as notas da faixa:
					notasFaixas.add(notas);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			arquivo.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public ArrayList<Integer> getInstrumentos() {
		return instrumentos;
	}

	public ArrayList<Notas> getNotasFaixas() {
		return notasFaixas;
	}
}
